package net.csdn.business.common.utils;

import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;

import java.util.Map;

/**
 * @author likun
 * @date 2022/6/28 21:43
 */
@Slf4j
public class StringTemplateUtil {

    private final static ExpressionParser PARSE = new SpelExpressionParser();
    private final static TemplateParserContext PARSER_CONTEXT = new TemplateParserContext();

    /**
     * 解析模板（spring spel）
     * <code>
     * String template = "#{[field]}值不符合规则：#{[regex]}";
     * Map<String, Object> params = Maps.newHashMap();
     * params.put("field", "test");
     * params.put("regex", "abc");
     * System.out.println(TemplateUtil.parseTemplate(template, params));
     * </code>
     *
     * @param template 模板
     * @param params   参数
     * @return String
     */
    public static String parseTemplate(String template, Map<String, Object> params) {
        try {
            return PARSE.parseExpression(template, PARSER_CONTEXT).getValue(params, String.class);
        } catch (Exception e) {
            log.error("parseTemplate error. template:{} params:{} ex:{}", template, params, JSON.toJSONString(e));
        }
        return StringUtils.EMPTY;
    }

    public static <T> String parseTemplate(String template, T context) {
        try {
            return PARSE.parseExpression(template, PARSER_CONTEXT).getValue(JsonUtil.toJsonObject(context), String.class);
        } catch (Exception e) {
            log.error("parseTemplate error. template:{} params:{} ex:{}", template, context, JSON.toJSONString(e));
        }
        return StringUtils.EMPTY;
    }
}